//package com.hz.activity7;
//
//import com.alibaba.fastjson.JSONObject;
//import com.hz.activity7.level.ActivitiController;
//import lombok.Setter;
//import org.activiti.engine.impl.util.CollectionUtil;
//import org.activiti.engine.repository.ProcessDefinition;
//import org.junit.jupiter.api.Test;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.activiti.engine.*;
//import org.activiti.engine.repository.Deployment;
//import org.activiti.engine.task.Task;
//
//import javax.annotation.Resource;
//import java.util.HashMap;
//import java.util.List;
//
//@SpringBootTest
//public class GateWayExclusive {
//
//    /**                【Activiti】
//     * Springboot+activiti【assignee不生效】【idea使用camunda-modeler】
//     *  解决方案:
//     *          如果将camunda加入到idea中并使用其画图，
//     *          在设置assignee和candidateUsers，candidateGroups时，
//     *          activiti无法解析，只有将其前缀从camunda改为activiti时，才可以使用。
//     *          如："activiti:assignee"。
//     *  补充：
//     * 在使用camunda-modeler为扩展工具画图后，再使用activiti，需要将画好的bpmn文件中的camunda修改为activiti，不仅仅是前缀修改为activiti，还有命名空间也要修改为activiti的命名空间。
//     * 命名空间示例：（最后的BPMN20.xsd有可能会报红，但是没有影响，如果觉得看的不爽，可以改为
//     * http://bpmn.sourceforge.net/schemas/BPMN20.xsd"）
//     *
//     * <bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//     *                    xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"
//     *                    xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
//     *                    xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
//     *                    xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
//     *                    xmlns:activiti="http://activiti.org/bpmn"
//     *                    id="sample-diagram"
//     *                    targetNamespace="http://bpmn.io/schema/bpmn"
//     *                    xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
//     */
//
//
//    /**
//     * 部署
//     */
//    @Test
//    public void addTable(){
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//        Deployment demo1 = repositoryService.createDeployment()
//                .addClasspathResource("activity/YunExclusive.bpmn") // 添加流程图
//                .name("流程部署YunExclusive查看步骤")
//                .deploy();
//        System.out.println("流程部署id===》"+demo1.getId());
//        System.out.println("流程部署name===》"+demo1.getName());
//    }
//
//    /**
//     * 启动实例  全局系统参数 设置
//     * 这里针对条件  分别启动两个流程实例
//     */
//    @Test
//    public void startProcess(){
//        // 获取流程引擎
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        // 获取 runtime 服务
//        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
//        // 指定哪个模板
//        String tempKey = "yunExclusive";
//
//        HashMap<String, Object> paramMap = new HashMap<>();
//        Evection evection = new Evection();
//        //evection.setNum(2); // 流程1
//        evection.setNum(4); // 流程2
//        paramMap.put("evection",evection);
//
//        // 启动流程实例
//        runtimeService.startProcessInstanceByKey(tempKey,paramMap);
//    }
//
//    /**
//     * 查询流程实例信息
//     */
//    @Test
//    public void queryTask(){
//        // 执行已部署的流程模板名称
//        String tempKey = "yunExclusive";
//        String assig = "test";
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        TaskService taskService = defaultProcessEngine.getTaskService();
//
//        List<Task> list = taskService.createTaskQuery()
//                .processDefinitionKey(tempKey) // 指定哪个流程图模板
//               // .taskAssignee(assig)  // 处理人
//                .list();
//        if(!CollectionUtil.isEmpty(list)){
//            list.forEach(x->{
//                System.out.println("流程实例 id ===》 "+x.getProcessInstanceId());
//                System.out.println("流程定义 id ===》" +x.getProcessDefinitionId());
//                System.out.println("任务 id ===》"+x.getId());
//                System.out.println("任务负责人 ===》"+x.getAssignee());
//                System.out.println("任务名称 ===》"+x.getName());
//                System.out.println("===========================================");
//            });
//        }
//    }
//
//
//
//    /**
//     * 工作流的节点与状态的扭转
//     * 这里有2个流程  分别对对应的任务 id 进行流程的推进
//     *
//     * 执行两次，将节点推送到 排他网关
//     */
//    @Test
//    public void completTask(){
//        String tempKey = "yunExclusive";
//        String assig = "test";
//        // 获取数据库的连接信息
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        TaskService taskService = defaultProcessEngine.getTaskService();
//
//        List<Task> list = taskService.createTaskQuery().processDefinitionKey(tempKey)
//              //  .taskAssignee(assig)
//                .list();
//        if(!CollectionUtil.isEmpty(list)){
//            list.forEach(task->{
//                //完成当前节点的任务id
//                System.out.println("任务 id ===》"+task.getId());
//                taskService.complete(task.getId());
//            });
//        }
//
//    }
//
//
//
//    @Resource
//    ActivitiController activitiController;
//    @Test
//    void testmudel(){
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("id", "b7218a60-405d-11f0-bdb9-581122a18e62");
//        activitiController.saveImageToLocal(jsonObject);
//    }
//
//
//
//
//
//
//
//
////=====================================任务挂起=====================================================
//    //挂起
//    @Test
//    public void suspend(){
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//        // 查询流程定义
//        ProcessDefinition singleResult = repositoryService.createProcessDefinitionQuery()
//                .processDefinitionKey("demo01")
//                .singleResult();
//        // 判断是否被挂起  如果被挂起 则让其激活；激活 则进行挂起操作
//        boolean suspended = singleResult.isSuspended();
//        System.out.println("singleResult.getId()==== "+singleResult.getId());
//        if(!suspended){
//            /**
//             * 激活  需要进行挂起操作
//             * 参数一：流程定义id
//             * 参数二：是否暂停
//             * 参数三：暂停时间
//             */
//            repositoryService.suspendProcessDefinitionById(
//                    singleResult.getId(),
//                    true,
//                    null);
//            System.out.println("流程已挂起");
//        }
//    }
//
////========================================待执行的任务===================================================
//    /**
//     * 查询当前个人待执行的任务
//     */
//    @Test
//    public void viewReDoTask(){
//        // 工作流从启动开始  就会流转至 第一个 UserTask 节点，
//        // 此时可以通过配置的 Assignee 查询指定的人的  一些待处理 任务信息
//        String assignee = "worker";
//        // 数据库连接配置操作
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        // 根据对应的流程 查询当前指定人的待处理任务信息
//        TaskService taskService = defaultProcessEngine.getTaskService();
//        List<Task> list = taskService.createTaskQuery()
//                .processDefinitionKey("demo01") // 指定哪个流程图模板
//                .taskAssignee(assignee) // 指定是谁负责待处理的任务
//                .list();
//        if(!CollectionUtil.isEmpty(list)){
//            list.forEach(x->{
//                System.out.println("流程实例 id ===》"+x.getProcessInstanceId());
//                System.out.println("任务 id ===》"+x.getId());
//                System.out.println("任务负责人 ===》"+x.getAssignee());
//                System.out.println("任务名称 ===》"+x.getName());
//                System.out.println("===========================================");
//            });
//        }
//    }
//
////========================================状态扭转======================================================
//    /**
//     * 工作流的节点与状态的扭转
//     *  执行扭转操作，如果扭转失败，则表示activiti能够很好地控制挂起操作
//     */
//    @Test
//    public void doTask(){
//        // 获取数据库的连接信息
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        TaskService taskService = defaultProcessEngine.getTaskService();
//
//        // 完成当前节点的任务  并向下推进
//        String taskId = "2505";
//        taskService.complete(taskId);
//    }
//
////=========================================流程激活========================================================
////流程激活
//    @Test
//    public void actProcess(){
//        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//        // 查询流程定义
//        ProcessDefinition singleResult = repositoryService.createProcessDefinitionQuery()
//                .processDefinitionKey("demo01")
//                .singleResult();
//        // 判断是否被挂起  如果被挂起 则让其激活；激活 则进行挂起操作
//        boolean suspended = singleResult.isSuspended();
//        System.out.println("singleResult.getId() ===》 "+singleResult.getId());
//        if(suspended){
//            /**
//             * 挂起  进行激活操作
//             * 参数一：流程定义id
//             * 参数二：是否激活
//             * 参数三：激活时间
//             */
//            repositoryService.activateProcessDefinitionById(singleResult.getId(),
//                    true,
//                    null);
//            System.out.println("流程激活成功");
//        }
//    }
////==========================================================================================================
//
//
//
//}
//
//
